package JUC;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

/**
 * BlockingQueueDemo 类用于演示生产者-消费者问题的解决方法
 * 它使用阻塞队列来协调生产者和消费者线程之间的交互
 */
public class BlockingQueueDemo {
    /**
     * 主函数执行生产者和消费者的线程
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 创建一个容量为10的阻塞队列
        BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);

        // 创建生产者线程
        Thread producer = new Thread(() -> {
            try {
                for (int i = 0; i < 20; i++) {
                    // 将数字0到19放入队列中，如果队列满了，将阻塞直到消费者取出元素
                    queue.put(i); // 如果队列满了，将阻塞  
                    System.out.println("Produced: " + i);
                }
            } catch (InterruptedException e) {
                // 捕获中断异常，并重新设置线程的中断状态
                Thread.currentThread().interrupt();
            }
        });

        // 创建消费者线程
        Thread consumer = new Thread(() -> {
            try {
                for (int i = 0; i < 20; i++) {
                    // 从队列中取出元素，如果队列为空，将阻塞直到生产者放入元素
                    int value = queue.take(); // 如果队列为空，将阻塞  
                    System.out.println("Consumed: " + value);
                }
            } catch (InterruptedException e) {
                // 捕获中断异常，并重新设置线程的中断状态
                Thread.currentThread().interrupt();
            }
        });

        // 启动生产者线程
        producer.start();
        // 启动消费者线程
        consumer.start();
    }
}
